<!DOCTYPE html>
<html lang="zh">
    <head>
        <meta charset="UTF-8" />
        <meta http-equiv="X-UA-Compatible" content="IE=edge" />
        <meta name="viewport" content="width=device-width, initial-scale=1.0" />
        <title>Document</title>
        <script>

            /* 
                高阶函数
                    - 如果一个函数的参数或返回值是函数，则这个函数就称为高阶函数
                    - 为什么要将函数作为参数传递？（回调函数有什么作用？）
                        - 将函数作为参数，意味着可以对另一个函数动态的传递代码
            
            */
            class Person {
                constructor(name, age) {
                    this.name = name
                    this.age = age
                }
            }

            const personArr = [
                new Person("孙悟空", 18),
                new Person("沙和尚", 38),
                new Person("红孩儿", 8),
                new Person("白骨精", 16),
            ]

            function filter(arr, cb) {
                const newArr = []

                for (let i = 0; i < arr.length; i++) {
                    if (cb(arr[i])) {
                        newArr.push(arr[i])
                    }
                }

                return newArr
            }

            // 我们这种定义回调函数的形式比较少见，通常回调函数都是匿名函数

            // function fn(a) {
            //     return a.name === "孙悟空"
            // }

            result = filter(personArr, a => a.name === "孙悟空")
            result = filter(personArr, a => a.age >= 18)

            const arr = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
            result = filter(arr, a => a % 2 === 0)

            console.log(result)
        </script>
    </head>
    <body></body>
</html>
